/*******************************************************************************************
 *      @name   pthread_attr.c
 *      @brief  这是在linux系统下的进程中初始化线程属性对象的代码案例，目的是学习线程的属性设置
 *      @date   2025/02/14
 *      @author cecelmx@126.com 
 *      @note
 *              1.线程的创建需要通过pthread_create()函数实现
 *              2.在编译程序的时候，需要指定选项 -pthread
 *              3.线程一旦创建成功，会立刻执行线程的回调函数，回调函数的格式是固定的
 *              4.一般线程创建之后都会执行一个死循环
 *              5.如果没有创建其他线程，则main()就是主线程，如果创建其他线程，其他线程属于子线程
 *              6.利用生产者-消费者模型来实现线程的同步，可以避免竞争条件
 *              7.想要修改线程的属性，需要先定义一个线程的属性对象(其实就是结构体变量)
 *              8.需要先对定义的线程属性对象进行初始化，调用pthread_attr_init()实现
 *              9.初始化之后的线程属性对象才可以进行设置，并提供给pthread_create()使用
 * 
 *      @version  xx.xx.xx   主版本号.次版本号.修正版本号
 * 
 *      CopyRight (c)   2024-2025   Your Name     All Right Reserved
 * 
 * ****************************************************************************************/

#include <time.h>
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>

//假设创建子线程用于获取当前系统时间并转化为固定格式的字符串，存储到缓冲区

char timebuf[128] = {0}; //用于记录转化好的系统时间  "2025/2/13 hh:mm:ss"


//构造线程的回调函数 格式是固定的
void *thread_handler(void *arg)
{

    for(;;)
    {
        //获取系统时间
        time_t ptime = time(NULL); //以秒为单位

        //转化系统时间
        struct tm *ptm = localtime(&ptime);
        sprintf(timebuf,"date:%d/%d/%d,time:%02d-%02d-%02d",
                                                        ptm->tm_year+1900,
                                                        ptm->tm_mon+1,
                                                        ptm->tm_mday,
                                                        ptm->tm_hour,
                                                        ptm->tm_min,
                                                        ptm->tm_sec                                           
        
                                                    );
        //显示系统时间
        printf("%s\n",timebuf);
                                                
        sleep(1);
         
        //由于新线程具有分离属性，所以在线程终止时会自动释放资源
        pthread_exit(NULL);
    }
    
}


int main()
{
   
    pthread_t newthread_id = 0;                //用于记录创建的新线程的ID，可以理解为是线程的句柄

    //1.定义属性对象并初始化
    pthread_attr_t attr;                        //用于记录线程的属性的对象，必须要初始化
    pthread_attr_init(&attr);                   //初始化属性对象


    //2.需要修改线程属性对象的分离属性为分离，这样线程终止时会自动释放资源，不需要调用pthread_join()
    pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);

    //3.创建新线程
    pthread_create(&newthread_id,&attr,thread_handler,NULL);

    
    //主线程的任务
    for(;;)
    {

    }

    return 0;
}

